from fastapi import APIRouter, HTTPException, Query
from pydantic import BaseModel
from typing import Optional, Dict, List
from .GoogleTranslator import translate_text

router = APIRouter(tags=["翻译"])

class TranslateRequest(BaseModel):
    text: str
    source_lang: Optional[str] = "auto"
    target_lang: Optional[str] = "zh-CN"

class TranslateResponse(BaseModel):
    original_text: str
    translated_text: str
    source_lang: str
    target_lang: str

class ChineseEnglishRequest(BaseModel):
    text: str
    to_chinese: bool = True  # 默认翻译为中文

class LanguageInfo(BaseModel):
    code: str
    name_cn: str

@router.post("/auto", response_model=TranslateResponse)
async def translate(request: TranslateRequest):
    """
    自动翻译接口
    
    - **text**: 要翻译的文本
    - **source_lang**: 源语言代码，默认为auto自动检测
    - **target_lang**: 目标语言代码，默认为zh-CN(简体中文)
    
    语言代码参考：
    - 英语: en
    - 简体中文: zh-CN
    - 繁体中文: zh-TW
    """
    try:
        translated = translate_text(
            text=request.text,
            source_lang=request.source_lang,
            target_lang=request.target_lang
        )
        
        return TranslateResponse(
            original_text=request.text,
            translated_text=translated,
            source_lang=request.source_lang,
            target_lang=request.target_lang
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"翻译失败: {str(e)}")

@router.post("/zh-en", response_model=TranslateResponse)
async def translate_chinese_english(request: ChineseEnglishRequest):
    """
    中英互译简化接口
    
    - **text**: 要翻译的文本
    - **to_chinese**: 是否翻译为中文，true-英译中，false-中译英，默认为true
    """
    try:
        if request.to_chinese:
            # 英译中
            source_lang = "en"
            target_lang = "zh-CN"
        else:
            # 中译英
            source_lang = "zh-CN"
            target_lang = "en"
            
        translated = translate_text(
            text=request.text,
            source_lang=source_lang,
            target_lang=target_lang
        )
        
        return TranslateResponse(
            original_text=request.text,
            translated_text=translated,
            source_lang=source_lang,
            target_lang=target_lang
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"翻译失败: {str(e)}")

@router.get("/languages")
async def get_languages():
    """
    获取支持的语言列表
    
    返回Google翻译支持的所有语言代码及其名称（包含英文和中文名称）
    """
    return {"languages": get_all_languages()}

@router.get("/languages/mute_search")
async def search_languages(q: str = Query(None, description="搜索关键词，支持模糊搜索和空格分隔的多条件搜索")):
    """
    模糊搜索语言列表
    
    支持按语言名称(英文或中文)进行模糊搜索，使用空格分隔可进行多条件搜索
    
    - **q**: 搜索关键词，例如 "chinese"、"中文"、"ch" 或 "中 en"
    """
    languages = get_all_languages()
    
    if not q:
        return {"languages": languages}
    
    # 将查询拆分为多个关键词（按空格分隔）
    keywords = [keyword.lower() for keyword in q.split()]
    
    result = {}
    for lang_name, lang_info in languages.items():
        # 检查每个关键词是否匹配
        for keyword in keywords:
            if (keyword in lang_name.lower() or 
                keyword in lang_info['name_cn'].lower() or 
                keyword in lang_info['code'].lower()):
                result[lang_name] = lang_info
                break
    
    return {"languages": result}

def get_all_languages():
    """返回所有支持的语言及其中文名称"""
    return {
        'afrikaans': {'code': 'af', 'name_cn': '南非荷兰语'},
        'albanian': {'code': 'sq', 'name_cn': '阿尔巴尼亚语'},
        'amharic': {'code': 'am', 'name_cn': '阿姆哈拉语'},
        'arabic': {'code': 'ar', 'name_cn': '阿拉伯语'},
        'armenian': {'code': 'hy', 'name_cn': '亚美尼亚语'},
        'assamese': {'code': 'as', 'name_cn': '阿萨姆语'},
        'aymara': {'code': 'ay', 'name_cn': '艾马拉语'},
        'azerbaijani': {'code': 'az', 'name_cn': '阿塞拜疆语'},
        'bambara': {'code': 'bm', 'name_cn': '班巴拉语'},
        'basque': {'code': 'eu', 'name_cn': '巴斯克语'},
        'belarusian': {'code': 'be', 'name_cn': '白俄罗斯语'},
        'bengali': {'code': 'bn', 'name_cn': '孟加拉语'},
        'bhojpuri': {'code': 'bho', 'name_cn': '博杰普尔语'},
        'bosnian': {'code': 'bs', 'name_cn': '波斯尼亚语'},
        'bulgarian': {'code': 'bg', 'name_cn': '保加利亚语'},
        'catalan': {'code': 'ca', 'name_cn': '加泰罗尼亚语'},
        'cebuano': {'code': 'ceb', 'name_cn': '宿务语'},
        'chichewa': {'code': 'ny', 'name_cn': '齐切瓦语'},
        'chinese (simplified)': {'code': 'zh-CN', 'name_cn': '简体中文'},
        'chinese (traditional)': {'code': 'zh-TW', 'name_cn': '繁体中文'},
        'corsican': {'code': 'co', 'name_cn': '科西嘉语'},
        'croatian': {'code': 'hr', 'name_cn': '克罗地亚语'},
        'czech': {'code': 'cs', 'name_cn': '捷克语'},
        'danish': {'code': 'da', 'name_cn': '丹麦语'},
        'dhivehi': {'code': 'dv', 'name_cn': '迪维希语'},
        'dogri': {'code': 'doi', 'name_cn': '多格拉语'},
        'dutch': {'code': 'nl', 'name_cn': '荷兰语'},
        'english': {'code': 'en', 'name_cn': '英语'},
        'esperanto': {'code': 'eo', 'name_cn': '世界语'},
        'estonian': {'code': 'et', 'name_cn': '爱沙尼亚语'},
        'ewe': {'code': 'ee', 'name_cn': '埃维语'},
        'filipino': {'code': 'tl', 'name_cn': '菲律宾语'},
        'finnish': {'code': 'fi', 'name_cn': '芬兰语'},
        'french': {'code': 'fr', 'name_cn': '法语'},
        'frisian': {'code': 'fy', 'name_cn': '弗里西语'},
        'galician': {'code': 'gl', 'name_cn': '加利西亚语'},
        'georgian': {'code': 'ka', 'name_cn': '格鲁吉亚语'},
        'german': {'code': 'de', 'name_cn': '德语'},
        'greek': {'code': 'el', 'name_cn': '希腊语'},
        'guarani': {'code': 'gn', 'name_cn': '瓜拉尼语'},
        'gujarati': {'code': 'gu', 'name_cn': '古吉拉特语'},
        'haitian creole': {'code': 'ht', 'name_cn': '海地克里奥尔语'},
        'hausa': {'code': 'ha', 'name_cn': '豪萨语'},
        'hawaiian': {'code': 'haw', 'name_cn': '夏威夷语'},
        'hebrew': {'code': 'iw', 'name_cn': '希伯来语'},
        'hindi': {'code': 'hi', 'name_cn': '印地语'},
        'hmong': {'code': 'hmn', 'name_cn': '苗语'},
        'hungarian': {'code': 'hu', 'name_cn': '匈牙利语'},
        'icelandic': {'code': 'is', 'name_cn': '冰岛语'},
        'igbo': {'code': 'ig', 'name_cn': '伊博语'},
        'ilocano': {'code': 'ilo', 'name_cn': '伊洛卡诺语'},
        'indonesian': {'code': 'id', 'name_cn': '印度尼西亚语'},
        'irish': {'code': 'ga', 'name_cn': '爱尔兰语'},
        'italian': {'code': 'it', 'name_cn': '意大利语'},
        'japanese': {'code': 'ja', 'name_cn': '日语'},
        'javanese': {'code': 'jw', 'name_cn': '爪哇语'},
        'kannada': {'code': 'kn', 'name_cn': '卡纳达语'},
        'kazakh': {'code': 'kk', 'name_cn': '哈萨克语'},
        'khmer': {'code': 'km', 'name_cn': '高棉语'},
        'kinyarwanda': {'code': 'rw', 'name_cn': '卢旺达语'},
        'konkani': {'code': 'gom', 'name_cn': '孔卡尼语'},
        'korean': {'code': 'ko', 'name_cn': '韩语'},
        'krio': {'code': 'kri', 'name_cn': '克里奥尔语'},
        'kurdish (kurmanji)': {'code': 'ku', 'name_cn': '库尔德语(库尔曼吉语)'},
        'kurdish (sorani)': {'code': 'ckb', 'name_cn': '库尔德语(索拉尼语)'},
        'kyrgyz': {'code': 'ky', 'name_cn': '吉尔吉斯语'},
        'lao': {'code': 'lo', 'name_cn': '老挝语'},
        'latin': {'code': 'la', 'name_cn': '拉丁语'},
        'latvian': {'code': 'lv', 'name_cn': '拉脱维亚语'},
        'lingala': {'code': 'ln', 'name_cn': '林加拉语'},
        'lithuanian': {'code': 'lt', 'name_cn': '立陶宛语'},
        'luganda': {'code': 'lg', 'name_cn': '卢干达语'},
        'luxembourgish': {'code': 'lb', 'name_cn': '卢森堡语'},
        'macedonian': {'code': 'mk', 'name_cn': '马其顿语'},
        'maithili': {'code': 'mai', 'name_cn': '迈蒂利语'},
        'malagasy': {'code': 'mg', 'name_cn': '马达加斯加语'},
        'malay': {'code': 'ms', 'name_cn': '马来语'},
        'malayalam': {'code': 'ml', 'name_cn': '马拉雅拉姆语'},
        'maltese': {'code': 'mt', 'name_cn': '马耳他语'},
        'maori': {'code': 'mi', 'name_cn': '毛利语'},
        'marathi': {'code': 'mr', 'name_cn': '马拉地语'},
        'meiteilon (manipuri)': {'code': 'mni-Mtei', 'name_cn': '曼尼普尔语'},
        'mizo': {'code': 'lus', 'name_cn': '米佐语'},
        'mongolian': {'code': 'mn', 'name_cn': '蒙古语'},
        'myanmar': {'code': 'my', 'name_cn': '缅甸语'},
        'nepali': {'code': 'ne', 'name_cn': '尼泊尔语'},
        'norwegian': {'code': 'no', 'name_cn': '挪威语'},
        'odia (oriya)': {'code': 'or', 'name_cn': '奥利亚语'},
        'oromo': {'code': 'om', 'name_cn': '奥罗莫语'},
        'pashto': {'code': 'ps', 'name_cn': '普什图语'},
        'persian': {'code': 'fa', 'name_cn': '波斯语'},
        'polish': {'code': 'pl', 'name_cn': '波兰语'},
        'portuguese': {'code': 'pt', 'name_cn': '葡萄牙语'},
        'punjabi': {'code': 'pa', 'name_cn': '旁遮普语'},
        'quechua': {'code': 'qu', 'name_cn': '克丘亚语'},
        'romanian': {'code': 'ro', 'name_cn': '罗马尼亚语'},
        'russian': {'code': 'ru', 'name_cn': '俄语'},
        'samoan': {'code': 'sm', 'name_cn': '萨摩亚语'},
        'sanskrit': {'code': 'sa', 'name_cn': '梵语'},
        'scots gaelic': {'code': 'gd', 'name_cn': '苏格兰盖尔语'},
        'sepedi': {'code': 'nso', 'name_cn': '北索托语'},
        'serbian': {'code': 'sr', 'name_cn': '塞尔维亚语'},
        'sesotho': {'code': 'st', 'name_cn': '索托语'},
        'shona': {'code': 'sn', 'name_cn': '绍纳语'},
        'sindhi': {'code': 'sd', 'name_cn': '信德语'},
        'sinhala': {'code': 'si', 'name_cn': '僧伽罗语'},
        'slovak': {'code': 'sk', 'name_cn': '斯洛伐克语'},
        'slovenian': {'code': 'sl', 'name_cn': '斯洛文尼亚语'},
        'somali': {'code': 'so', 'name_cn': '索马里语'},
        'spanish': {'code': 'es', 'name_cn': '西班牙语'},
        'sundanese': {'code': 'su', 'name_cn': '巽他语'},
        'swahili': {'code': 'sw', 'name_cn': '斯瓦希里语'},
        'swedish': {'code': 'sv', 'name_cn': '瑞典语'},
        'tajik': {'code': 'tg', 'name_cn': '塔吉克语'},
        'tamil': {'code': 'ta', 'name_cn': '泰米尔语'},
        'tatar': {'code': 'tt', 'name_cn': '鞑靼语'},
        'telugu': {'code': 'te', 'name_cn': '泰卢固语'},
        'thai': {'code': 'th', 'name_cn': '泰语'},
        'tigrinya': {'code': 'ti', 'name_cn': '提格利尼亚语'},
        'tsonga': {'code': 'ts', 'name_cn': '聪加语'},
        'turkish': {'code': 'tr', 'name_cn': '土耳其语'},
        'turkmen': {'code': 'tk', 'name_cn': '土库曼语'},
        'twi': {'code': 'ak', 'name_cn': '契维语'},
        'ukrainian': {'code': 'uk', 'name_cn': '乌克兰语'},
        'urdu': {'code': 'ur', 'name_cn': '乌尔都语'},
        'uyghur': {'code': 'ug', 'name_cn': '维吾尔语'},
        'uzbek': {'code': 'uz', 'name_cn': '乌兹别克语'},
        'vietnamese': {'code': 'vi', 'name_cn': '越南语'},
        'welsh': {'code': 'cy', 'name_cn': '威尔士语'},
        'xhosa': {'code': 'xh', 'name_cn': '科萨语'},
        'yiddish': {'code': 'yi', 'name_cn': '意第绪语'},
        'yoruba': {'code': 'yo', 'name_cn': '约鲁巴语'},
        'zulu': {'code': 'zu', 'name_cn': '祖鲁语'}
    } 